package com.JavaNet.chapter2_io;



import java.io.File;
import java.io.IOException;

/**
 * @author : sky-吴
 *
 * 日期：2020/4/25
 *
 *在Java中, 有个分隔符常量		File.separator  在win 中是\ , 在Linux中是 /
 *
 *在idea工程中 相对路径是工程名下的路径 , 如: E:\Java\codeLibraries\JavaSE\Java_revise
 *
 * java.io.File 类是专门对文件进行操作的类，只能对文件本身进行操作，不能对文件内容进行操作。  也是文件和目录路径名的抽象表示，主要用于文件和目录的创建、查找和删除等操作
 *
 * new File("1.txt").createNewFile();  这种直接创建在 项目的根目录下
 *
 * 所有不在cpu和 内存的 数据处理 都涉及到 io, 例如: 网络, 显示器 , 如果说直播 还涉及到 摄像头, 音箱;
 * 文件涉及到硬盘, so 这个 file 类隶属于 io包
 *
 * file 和 流 没有关系; 文件 和 流 需要一个桥梁, 那就是 文件流
 *
 *
 */
public class FilePropertyDemo {

	public static void main(String[] args) throws IOException {
		File dir = new File("d:/temp", "test");
		//第一个参数是 目录对象, 第二个参数是文件名, 文件要想创建成功, 目录必须存在
		File realFile= new File(dir, "1.txt");
		createFileInIO(realFile);
		showFileProperties(realFile);

 		new File("E:\\Java\\absoluteFile.txt");   //绝对路径创建
		new File("1.txt").createNewFile();        //相对路径创建  D:\java\codeLibraries\javaEE\Java-net-programming\1.txt
	}



	/**
	 * 	内存层面的方法, 它是不会报io异常的错
	 * */
	public static void showFileProperties(File file){
		System.out.println("-----------showFileProperties---------");

		System.out.println(file.getName()+    "    realFile.delete() = " + file.delete());
		System.out.println(file.getName()+    "    文件或者文件夹的名称是："+file.getName());
		System.out.println(file.getName()+    "    绝对路径是："+file.getPath());
		System.out.println(file.getName()+    "    绝对路径是："+file.getAbsolutePath());
		System.out.println(file.getName()+    "    文件大小是（以字节为单位）:"+file.length());
		System.out.println(file.getName()+    "    file.getParent() 父路径是"+file.getParent());
		System.out.println(file.getName()+    "    文件或者文件夹存在吗？"+file.exists());
		System.out.println(file.getName()+    "    是一个文件吗？"+file.isFile());
		System.out.println(file.getName()+    "    是一个文件夹吗？"+file.isDirectory());
		System.out.println(file.getName()+    "    是隐藏文件吗？"+file.isHidden());
		System.out.println(file.getName()+    "    file.canExecute() = " + file.canExecute());
		System.out.println(file.getName()+    "    file.canWrite() = " + file.canWrite());
		System.out.println(file.getName()+    "    file.canRead() = " + file.canRead());
		System.out.println(file.getName()+    "    此路径是绝对路径名？"+file.isAbsolute());
		System.out.println(file.getName()+    "    最后一次被修改的时间(不存在则为 0 ): "+file.lastModified());
		System.out.println(file.getName()+    "    文件或文件夹的名称，不包含上级路径: "+file.getName());
		System.out.println("-------------end----------------------");
	}

	/**这是一个错误的路径, 在win中上面的特殊字符都是不允许的, 但是在内存中的却能创建对象, 但是
    写到磁盘中将会报错*/
	public static void showError(){

		File errorFile =new File("d:\\\\\\///::<?***||||>:xxxxxxxxx");
		System.out.println("relativeFile 对象路径是绝对路径名？"+errorFile.getAbsolutePath());
		createFileInIO(errorFile);
	}

	/**
	 * io层面的方法, 一般都有try catch
	 * @param file
	 */
	public static void createFileInIO(File file) {
		System.out.println("文件的绝对路径是: " + file.getAbsolutePath());
		if (!file.exists()){

			File dir=new File(file.getParent());
			if (!dir.exists()){
				System.out.print("父目录"+dir.getAbsolutePath()+" 不存在!! ");
				dir.mkdirs();
				System.out.println("父目录"+dir.getAbsolutePath()+" 创建成功");
			}
			try {
				boolean crateResult = file.createNewFile();
				System.out.println("文件不存在并创建成功");
			} catch (IOException e) {
				System.out.println("文件创建失败");
				e.printStackTrace();
			}
		}else{
			System.out.print("文件已存在");
			file.delete();
			System.out.println(", 已经删掉");
		}
	}



}
